package com.cy.sys.service.impl;

import java.util.List;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import com.cy.common.exception.ServiceException;
import com.cy.common.pojo.ZtreeNodes;
import com.cy.common.util.ShiroUtil;
import com.cy.sys.dao.SysDeptDao;
import com.cy.sys.dao.SysUserDao;
import com.cy.sys.pojo.SysDept;
import com.cy.sys.service.SysDeptService;

/**
 * 此类定义了部门模块所有业务逻辑的实现
 * @author private
 *
 */
@Service
public class SysDeptServiceImpl implements SysDeptService {
	@Autowired
	private SysDeptDao sysDeptDao;
	@Autowired
	private SysUserDao sysUserDao;
	
	/** 查询所有部门数据并进行封装 */
	@RequiresPermissions("sys:dept:view")
	@Override
	public List<SysDept> doFindObjects() {
		return sysDeptDao.selectObjects();
	}

	/** 获取部门节点信息并进行封装 */
	@Override
	public List<ZtreeNodes> doFindZTreeNodes() {
		List<ZtreeNodes> nodes = sysDeptDao.selectZTreeNodes();
		return nodes;
	}

	/** 保存新增部门信息 */
	@RequiresPermissions("sys:dept:add")
	@Transactional(rollbackFor = Exception.class)
	@Override
	public int doSaveObject(SysDept sysDept) {
		//1.参数校验
		if(sysDept==null)
			throw new IllegalArgumentException("请填写要增加的部门信息");
		if(StringUtils.isEmpty(sysDept.getName()))
			throw new IllegalArgumentException("请填写部门名称后保存!");
		//2.处理保存业务
		sysDept.setCreatedUser(ShiroUtil.getUserName());
		int rows = sysDeptDao.insertObject(sysDept);
		if(rows==0) throw new ServiceException("出现未知错误,添加失败!");
		//3.回传结果
		return rows;
	}

	/** 修改部门信息 */
	@RequiresPermissions("sys:dept:update")
	@Transactional(rollbackFor = Exception.class)
	@Override
	public int doUpdateObject(SysDept sysDept) {
		//1.参数校验
		if(sysDept==null)
			throw new IllegalArgumentException("请填写要修改的部门信息");
		if(sysDept.getId()==null||sysDept.getId()<1)
			throw new IllegalArgumentException("此部门信息无效!");
		if(StringUtils.isEmpty(sysDept.getName()))
			throw new IllegalArgumentException("请填写部门名称后保存!");
		//2.处理修改业务
		sysDept.setModifiedUser(ShiroUtil.getUserName());
		int rows = sysDeptDao.updateObject(sysDept);
		if(rows==0)
			throw new ServiceException("此部门可能已经不存在!");
		//3.回传结果
		return rows;
	}

	/** 删除指定id的部门,如果部门下有员工或部门下还有子部门则不允许删除 */
	@RequiresPermissions("sys:dept:delete")
	@Transactional(rollbackFor = Exception.class)
	@Override
	public int doDeleteObject(Integer id) {
		//1.参数校验
		if(id==null || id<1)
			throw new IllegalArgumentException("选择的部门无效!");
		//2.校验部门下是够还有子部门
		int childCount = sysDeptDao.selectChlidsById(id);
		if(childCount>0)
			throw new ServiceException("请先删除此部门下的子部门!");
		//3.查询校验部门下是否有员工
		int count = sysUserDao.selectObjectsByDeptId(id);
		if(count>0) throw new ServiceException("请先删除本部门下所有员工!");
		//4.删除部门
		int rows = sysDeptDao.deleteObjectById(id);
		if(rows==0)
			throw new ServiceException("此部门可能已经不存在!");
		//5.返回结果
		return rows;
	}
	
}
